#pragma once
#include <string>
#include <FCB.h>
#include <SuperBlock.h>
#include <exception>
const int mask = 1024;                            //文件系统标识
const int M = 1024 * 1024;                        //对M的定义
const int G = 1024 * M;                           //对G的定义
const int inodeOffset = 128;                      //inode区的组内偏移
const int groupOffset = 2024;                     //组描述符的组内偏移
const int superOffset = 2036;                     //超级块的组内偏移
const int dataOffset = 2048;                      //数所区的组内偏移

using namespace std;

class FCBInvalidError : public exception{};       //FCB读取异常


//判断一个文件是否是一符合格式的虚拟磁盘
bool isADisk(string filename);

//创建指定大小的虚拟磁盘
bool createDisk(string diskname, int size);

//删除一个虚拟磁盘
bool removeDisk(string diskname);

//打开一个虚拟磁盘
bool openDisk(string diskname, SuperBlock* & superBlock, FCB* & root);

//创建一个文件在虚拟磁盘中
bool createFile(string diskname, FCB dir, string filename, int type);

//删除一个文件在虚拟磁盘中
bool removeFile(string diskname, FCB dir, string filename);

//读取一个文件在虚拟磁盘中(start指文件位置，下同)
int readFile(string diskname, FCB fcb, char* buffer, int start, int bytes);

//写一个文件在虚拟磁盘中
int writeFile(string diskname, FCB fcb, char* buffer,int start, int bytes);

//打开一个文件，即获得其PCB
FCB* openFile(string diskname, FCB dir, string filename);

//重新加载fcb
FCB reloadFile(string diskname, FCB fcb);

//获得文件系统信息
bool getFileSystemInfo(string diskname, int& total, int& remain);

//对内部函数的测试
void test();